iT邦幫忙

2022 iThome 鐵人賽

DAY 13
0

[DAY 4] 讓我們可以帶著資料走的變數中,我們了解了透過宣告變數可以讓我們在程式中儲存及使用資料。可是,一項變數只能儲存一項資料,那當我們需要處理大量資料時,難道說我們要大量宣告變數嗎?今天,我們便要討論用來解決這個問題的陣列 (Array)

陣列是一種可以用來儲存及管理大量資料的資料結構 (Data Structure)。根據定義,被儲存在陣列中的資料會被稱為元素 (Elements) 並可以透過索引 (Index) 來進行管理。這是什麼意思呢?在介紹變數時我們提到了可以把它想像成一個裝著資料的容器,那麼陣列便是複數的容器了。可是,想像一下,假如我們現在有一排裝著東西 (資料) 的箱子 (元素),那我們怎麼知道哪一個箱子 (元素) 會裝著什麼東西 (資料) 呢?如果這時侯我們在每一個箱子加上一個編號 (索引) 的話,我們是不是就會更容易管理箱子 (元素) 呢?這就是陣列的基本概念。

宣告及使用陣列

陣列就像是變數一樣,在我們使用它前必須先在程式中進行宣告。不同的程式語言宣告陣列的方式都會略有不同,不過一般來說,宣告陣列都會需要以下幾個部分:

  1. **資料型態:**陣列作為變數的延伸概念,大多數的程式語言也需要我們在宣告時指定陣列所儲存的資料型態,而動態語言則不用。
  2. **陣列長度:**在宣告陣列時我們也需要為陣列指定可以儲存的變數的數量,也就是它的長度,這是因為在使用陣列前程式便需要為它預先保留用來儲存資料的空間。需要注意的是,陣列的長度在指定後也是不能被隨意改變的,只能透過重新宣告才能讓陣列的長度變化。部分的程式語言並沒有這個限制,甚至不需要預先指定長度,但這是因為那些語言在這其中混合了其他資料結構的概念,因此並不會在這裡進行詳細的討論。
  3. **陣列名稱:**跟變數一樣,我們需要為被宣告的陣列命名。

當我們宣告陣列後,我們可以直接呼叫陣列本身來存取整個陣列,但更多的情況下則是以陣列名稱加上索引的方式來存取某個陣列中的元素。在大多數的語言中,我們會使用下標運算子 ([]) 來指定陣列的長度及索引。需要注意的是,大多數的程式語言中,陣列中的第一個元素是以 0 為開始的索引的

以下是一個使用陣列的例子:[C#]

using System;

public class ArrayExample
{
    public static void Main(string[] args)
    {
        int[] nums = new int[10]; // 宣告 int 陣列 nums 並指定長度為 10
        for (int i = 0; i < nums.Length; i++) { // <-- 索引從 0 開始進行存取
            nums[i] = i; // 在 for 迴圈中以變數 i 的值為索引並把 i 的值儲存到陣列的第 i 個元素中
        }
        // 這時陣列 nums 的元素儲存的值為:
        // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
        for (int i = 0; i < nums.Length; i++) {
            Console.WriteLine (nums[i]); // 在 for 迴圈中以變數 i 的值為索引並把第 i 個元素的值顯示出來
        }
    }
}

多維陣列

作為陣列的概念的延伸,我們也會使用陣列來儲存複數的陣列,因此我們便以維度來區分開這些情況:一維陣列是指直接儲存變數的陣列、二維陣列是指儲存陣列的陣列、三維陣列是指儲存二維陣列的陣列、...、如此類推,如此一來我們便可以透過形容陣列的維度知道陣列的層數。在多維陣列中,二維陣列是最常被使用的,這是因為它能用來表示類似數學中矩陣的概念,這使我們能以類似表格的方式來想像它的運作方式,讓資料的管理在感覺上變得較具體。

以下是一個使用二維陣列的例子:[C#]

using System;

public class Array2DExample
{
    public static void Main(string[] args)
    {
        string [][] pos = new string[5][]; // 宣告 string 二維陣列 pos 並指定長度為 5
        for (int i = 0; i < pos.Length; i++) {
            pos[i] = new string[5]; // 宣告 pos 中的第 i 個陣列並指定長度為 5
            for (int j = 0; j < pos[i].Length; j++) {
                pos[i][j] = "(" + i.ToString() + ", " + j.ToString() + ")"; // 把字串 ([i], [j]) 儲存在陣列 i 的元素 j 中
            }
        }
        for (int i = 0; i < pos.Length; i++) {
            for (int j = 0; j < pos[i].Length; j++) {
                Console.Write(pos[i][j] + " "); // 把儲存在陣列 i 的元素 j 的字串顯示出來 (不換行)
            }
            Console.WriteLine(); // 換行
        }
    }
}

執行程式後我們會得到下方的結果,這讓我們能容易理解二維陣列的資料的儲存方式:

(0, 0) (0, 1) (0, 2) (0, 3) (0, 4) [陣列 0]
(1, 0) (1, 1) (1, 2) (1, 3) (1, 4) [陣列 1]
(2, 0) (2, 1) (2, 2) (2, 3) (2, 4) [陣列 2]
(3, 0) (3, 1) (3, 2) (3, 3) (3, 4) [陣列 3]
(4, 0) (4, 1) (4, 2) (4, 3) (4, 4) [陣列 4]
[元素 0][元素 1][元素 2][元素 3][元素 4]

透過 foreach 迴圈陳述式存取陣列資料

介紹 for 迴圈時我們曾經提過,for 迴圈中有一種陳述式是使用資料集合的資料數來決定重複執行的次數的,也就是 foreach 迴圈陳述式。由於 foreach 迴圈陳述式有著能確保該集合中的所有資料都能在迴圈中被使用的特點,加上跟傳統的 for 迴圈陳述式的寫法相比更為簡潔,因此在非指定元素的大量存取陣列資料時,foreach 迴圈陳述式是其中一個非常受歡迎的選項。然而,由於它的存取方式捨棄了索引的概念,因此如果想要修改陣列中的某些特定元素時,for 迴圈陳述式通常會更為方便。

以下是使用 foreach 迴圈陳述式存取陣列資料的例子:[Python]

nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 建立儲存了數字 1 - 10 的陣列 nums
for num in nums:  # foreach 迴圈閞始:從陣列 nums 中使用每一個元素並暫時將其儲存在變數 num 來執行迴圈內容
    print(num) # 顯示:變數 num 的值

上一篇
[DAY 12] 改變程式流程的跳躍陳述式
下一篇
[DAY 14] 字元 + 陣列 = 字串
系列文
程式基礎概念討論30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言